<?php
/**
 * Session Manager
 * @author Sokha RUM
 */
class Ksession {
	const SESSION_KEY = "KHAWIN"; 
	const SESSION_APP = "K_MAIN_APP";
	const SESSION_USER_KEY = "K_USER_KEY";
	const SESSION_DATA_KEY = "K_DATA_KEY";
	const SESSION_FLASH_KEY = "K_FLASH_KEY";
	const SESSION_CRITERIA_KEY = "K_CRITERIA_KEY";
	const TIMEOUT = 3600;
	
	/**
     * Initialize session
     * return 0 - Normal
     *        1 - Expired
     */
    static function initializeSession() {
    	session_start();
    	
    	if (!isset($_SESSION[Ksession::SESSION_KEY])) {
            $_SESSION[Ksession::SESSION_KEY] = array();
            $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP] = array();
            $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_DATA_KEY] = array();
            $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_FLASH_KEY] = array();
            $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_CRITERIA_KEY] = array();
        }
    	$uri = trim(uri_string(), "/");
    	if (!k_start_with($uri, "ajax/")) {
	        if (isset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CUR_URL"])) {
		    	$_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["PRE_URL"] = $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CUR_URL"];
		    }
		    $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CUR_URL"] = cur_page_url();
		    
    	}
    	
    	if ($uri == "" || k_start_with($uri, "misc/homepage") ) {
    		$_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_CRITERIA_KEY] = array();
    	}
	    
    	if (!isset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CREATE"])) {
    		$_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CREATE"] = time();
		} else if (time() - $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CREATE"] > Ksession::TIMEOUT) {
	    	// session started more than 30 minates ago
    		//session_regenerate_id(true);    // change session ID for the current session an invalidate old session ID
    		//Ksession::destroy();
    		$_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CREATE"];
    		$_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CREATE"] = time();
    		return 1;
		}
		$_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["CREATE"] = time();
    	
		return 0;
    }
    
	
	/**
	 * Set user to session
	 * @param unknown_type $user
	 */
	static function setUser($user) {
        $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_USER_KEY] =  Kencryption::encrypt(serialize($user)); 
    }
    
    /**
     * getting session from user
     */
	static function getUser() {
    	if (!isset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_USER_KEY])) { return null;} 
        return unserialize(Kencryption::decrypt($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_USER_KEY]));
    }
    
    /**
     * Setting data to session
     * @param unknown_type $key
     * @param unknown_type $data
     */
    static function setData($key, $data) {
        $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_DATA_KEY][$key] = $data;
    }
    
    /**
     * getting data from session
     * @param unknown_type $key
     */
	static function getData($key) {
        if (!isset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_DATA_KEY][$key])) { return null;} 
        return $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_DATA_KEY][$key];
    }
    
    /**
     * Removing data from session
     * @param unknown_type $key
     */
    static function removeData($key) {
        unset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_DATA_KEY][$key]);
    }
    
    /**
     * setting flash to session
     * @param unknown_type $key
     * @param unknown_type $flash
     */
    static function setFlash($key, $flash) {
    	$_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_FLASH_KEY][$key] = $flash;
    }
    
    /**
     * getting flash from session
     * @param unknown_type $key
     */
	static function getFlash($key) {
    	if (!isset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_FLASH_KEY][$key])) { return null;} 
        $result = $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_FLASH_KEY][$key];
        unset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_FLASH_KEY][$key]);
        return $result;
    }
    
    /**
     * Destroy a session
     */
    static function destroy() {
    	unset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_DATA_KEY]);
    	unset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]);
    	unset($_SESSION[Ksession::SESSION_KEY]);
    }
    static function getLastPageUrl() {
    	return $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP]["PRE_URL"];
    }
    static function setCriteria($key, $criteria) {
    	 $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_CRITERIA_KEY][$key] = $criteria;
    }
   static function getCriteria($key) {   	 if (!isset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_CRITERIA_KEY][$key])) {    	 	return null;   	 }     return $_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_CRITERIA_KEY][$key];   }
    static function removeCriteria($key) {
       if (isset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_CRITERIA_KEY][$key])) {
       	   unset($_SESSION[Ksession::SESSION_KEY][Ksession::SESSION_APP][Ksession::SESSION_CRITERIA_KEY][$key]);
       }
    }
}
?>